﻿using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeModelo : ValidadorAbastrato
    {
        private Modelo _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Modelo> _repositorioDeModelo;
        
        public ValidadorDeModelo(IRepositorioDeConsultaDeObjetos<Modelo> repositorioDeModelo)
        {
            if (repositorioDeModelo == null)
	        {
		        throw new ArgumentNullException("repositorioDeModelo");
	        }

            _repositorioDeModelo = repositorioDeModelo;
        }

        public void ValideCadastro(Modelo modelo)
        {
            if (modelo == null)
            {
                throw new ArgumentException("modelo");
            }

            _objetoValidado = modelo;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideMarcaNaoInformada();
            ValideDescricaoNaoInformada();
            ValideModeloJaCadastrado();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao(Modelo modelo)
        {
            if (modelo == null)
            {
                throw new ArgumentException("modelo");
            }

            _objetoValidado = modelo;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideMarcaNaoInformada();
            ValideDescricaoNaoInformada();
            ValideModeloNaoCadastrado();

            base.GarantaSucesso();
        }

        public void ValideExclusao(Modelo modelo)
        {
            if (modelo == null)
            {
                throw new ArgumentException("Modelo");
            }

            _objetoValidado = modelo;
            base.LimpeInconsistencias();

            ValideModeloNaoCadastrado();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideMarcaNaoInformada()
        {
            if (_objetoValidado.Marca == null)
            {
                AdicioneInconsistencia("Marca não informada.");
            }
        }

        private void ValideDescricaoNaoInformada()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Descricao))
            {
                AdicioneInconsistencia("Descrição não informada.");
            }
        }

        private bool ModeloJaCadastrado()
        {
            return _repositorioDeModelo.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideModeloJaCadastrado()
        {
            if (ModeloJaCadastrado())
            {
                AdicioneInconsistencia("Já existe uma Modelo cadastrado com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideModeloNaoCadastrado()
        {
            if (!ModeloJaCadastrado())
            {
                AdicioneInconsistencia("Modelo com o código {0} não cadastrado.", _objetoValidado.Codigo);
            }
        }
    }
}
